import * as vscode from 'vscode';
import { TreeSitter } from '../../../../core/treesitter/TreeSitter';

export class OtherProcessor {
    public static getFunctionRange(doc: vscode.TextDocument, pos: vscode.Position): vscode.Range {
        const functionRanges = TreeSitter.getInstance().getFunctionRangeFromCache(doc);
        const latestRanges = this.findLatestRange(functionRanges, pos, doc);
        if (!latestRanges) {
            throw Error(`Can not get latest Ranges for ${pos.line}`);
        }
        return latestRanges;
    }

    private static findLatestRange(ranges: vscode.Range[], pos: vscode.Position, document: vscode.TextDocument): vscode.Range | null {
        if (!ranges?.length || !pos) {
            return null;
        }
        // 1. 首先检查是否有完全包含目标位置的范围
        let containingRange;
        for (let i = ranges.length - 1; i >= 0; i--) {
            if (pos.line >= ranges[i].start.line && pos.line <= ranges[i].end.line) {
                containingRange = ranges[i];
                break;
            }
        }
        if (containingRange) {
            return containingRange;
        }
        // 2. 对范围进行预处理和排序
        const sortedRanges = [...ranges].sort((a, b) => b.end.line - a.end.line);
        // 3. 查找最近的有效范围
        for (const range of sortedRanges) {
            // 如果目标位置在当前范围的结束位置之后，说明需要找下一个范围
            if (pos.line > range.end.line) {
                continue;
            }
            // 如果目标位置在当前范围的开始位置之前，检查中间是否都是空行
            if (pos.line < range.start.line) {
                let allEmpty = true;
                // 检查从选中位置到范围开始位置的所有行
                for (let line = pos.line; line < range.start.line; line++) {
                    if (document.lineAt(line).text.trim() !== "") {
                        allEmpty = false;
                        break;
                    }
                }
                if (allEmpty) {
                    return range;
                }
            }
        }
        // 4. 如果没有找到合适的范围，返回最后修改的范围
        return sortedRanges[0] || null;
    }
}

